home *** CD-ROM | disk | FTP | other *** search
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;; si-fstabs-lib - Library for generating f2c-stabs emacs files from
- ;;; si info.
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;
- ;;; Copyright (c) 1996 Harvey J. Stein <abel@netvision.net.il>, and
- ;;; eventually <hjstein@netvision.net.il>
- ;;; All Rights Reserved.
- ;;;
- ;;; This package is covered by the GNU GPL. You can freely use and
- ;;; distribute it as long as it stays under the GNU GPL, and as long as
- ;;; you distribute all the corresponding source code, and as long as this
- ;;; message and the above copyright notice remains.
-
- (require "si-lib")
-
- (define (build-and-add-f2c-stab-data si-decl)
- (with-output-to-file (format #f "| cat >>~a" (sif2c-file-name si-decl))
- (lambda () (si2f2c-stab si-decl))))
-
- (define (sif2c-file-name si-decl)
- (string-append (symbol->string (si-filename si-decl))
- ".el"))
-
- (define (inc->req s)
- (if (symbol? s) s
- (string->symbol s)))
-
- ;; (define suff (string->regexp "^(.*)\\.(.*)$"))
- ;; (apply substring s (list-ref (suff s) 1))
-
- (define (sif2c-mangle-subname sub)
- (set! sub (symbol->string sub))
- (string->symbol
- (string-append sub
- (if (string-find? "_" sub) "__" "_"))))
-
- (define (si2f2c-stab decl)
- (let* ((context (si-subname decl))
- (common-vars (apply append
- (map si-common-vars
- (si-common decl)))))
- (if (eq? context '*undefined*)
- (set! context (si-filename decl)))
-
- (format #t ";;; Included files:\n")
- (for-each (lambda (inc-file-rec)
- (format #t "(f2c-require '~a)\n"
- (inc->req (si-incs-file-name inc-file-rec))))
- (si-includes decl))
-
- (format #t "\n\n;;; Arguments:\n")
- (for-each (lambda (var-rec)
- (dump-chunk context 'f2c-add-arg-var var-rec))
- (si-args decl))
-
- (format #t "\n\n;;; Local arrays:\n")
- (for-each (lambda (var-rec)
- (if (not (member (si-arg-name var-rec)
- common-vars))
- (dump-chunk context 'f2c-add-local-var var-rec)))
- (arrays-only (si-locals decl)))
-
- (format #t "\n\n;;; Common blocks:\n")
- (for-each (lambda (common)
- (let ((cname (si-common-name common)))
- (for-each (lambda (cvar)
- (dump-chunk cname 'f2c-add-common-var
- (assoc cvar (si-locals decl))))
- (si-common-vars common))
- (format #t "(f2c-add-subcontext '~a '~a)\n"
- context cname)))
- (si-common decl))
-
- (format #t "\n\n;;; Parameters:\n")
- (for-each (lambda (param)
- (format #t "(f2c-add-param '~a '~a ~s)\n"
- context
- (si-param-name param)
- (si-param-value param)))
- (si-params decl))
-
- (format #t "\n\n;;; Subcontexts (from include files):\n")
- (for-each (lambda (inc-file-rec)
- (format #t "(f2c-add-subcontext '~a '~a)\n"
- context
- (inc->req (si-incs-file-name inc-file-rec))))
- (si-includes decl))))
-
- (define (arrays-only l)
- (cond ((null? l) ())
- ((si-arg-dimen (car l))
- (cons (car l)
- (arrays-only (cdr l))))
- (else (arrays-only (cdr l)))))
-
-
- (define (dump-chunk fnam func var-decl)
- (let* ((var (si-arg-name var-decl))
- (dlist (si-arg-dimen var-decl))
- (dimens (if dlist (map string-lower dlist)
- #f))
- (dims (if dimens (si2f2c-stab-aref-convert dimens)
- #f)))
- (if (and dims (not (null? dims)))
- (format #t "(~S '~S '~S '~S '~S)\n"
- func fnam var (list-ref dims 0) (list-ref dims 1))
- (format #t "(~S '~S '~S)\n"
- func fnam var))))
-
-
- ;;;(define (si-index-cleaner strng)
- ;;; (define justnum
- ;;; (string->regexp "^[ \t]*[-+]?[0-9]+[ \t]*$"))
- ;;; (define num:num
- ;;; (string->regexp "^[ \t]*([-+]?[0-9]+)[ \t]*:[ \t]*([-+]?[0-9]+)[ \t]*$"))
- ;;; (define expr:expr
- ;;; (string->regexp "^(.*):(.*)$"))
- ;;;
- ;;; (let ((match (justnum strng)))
- ;;; (call/cc
- ;;; (lambda (return)
- ;;; (if match
- ;;; (return (list (string->number strng) 1)))
- ;;; (set! match (num:num strng))
- ;;; (if match
- ;;; (return (map string->number
- ;;; (list (apply substring strng (list-ref match 2))
- ;;; (apply substring strng (list-ref match 1))))))
- ;;; (set! match (expr:expr strng))
- ;;; (if match
- ;;; (return (list (apply substring strng (list-ref match 2))
- ;;; (apply substring strng (list-ref match 1)))))
- ;;; (return (list strng 1))))))
-
- (define (si-index-cleaner strng)
- (define expr:expr
- (string->regexp "^(.*):(.*)$"))
- (let ((match (expr:expr strng)))
- (if match
- (list (apply substring strng (list-ref match 2))
- (apply substring strng (list-ref match 1)))
- (list strng "1"))))
-
- (define (si2f2c-stab-aref-convert dimens)
- (transpose (map si-index-cleaner dimens)))
-
- (define (transpose l)
- (cond ((null? l) ())
- ((null? (car l)) ())
- (else (cons (map car l)
- (transpose (map cdr l))))))
-
- (provide "si-fstabs-lib")
-